package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpRewardPunishDAO;
import org.jsola.hr.dto.EmpRewardPunishAddDTO;
import org.jsola.hr.dto.EmpRewardPunishDTO;
import org.jsola.hr.dto.EmpRewardPunishUpdateDTO;
import org.jsola.hr.entity.EmpRewardPunishDO;
import org.jsola.hr.query.EmpRewardPunishQuery;
import org.jsola.hr.vo.EmpRewardPunishListVO;
import org.jsola.hr.vo.EmpRewardPunishVO;
import org.jsola.user.core.TokenUser;

import javax.validation.constraints.NotNull;
import java.util.List;


/**
 * 员工奖惩记录
 *
 * @author zhr
 */
public interface IEmpRewardPunishService extends IService<IEmpRewardPunishDAO, EmpRewardPunishDO> {

    /**
     * 新增员工奖惩记录
     *
     * @param empRewardPunishAddDTO 新增员工奖惩记录DTO
     * @param tokenUser             当前用户
     * @return 员工奖惩记录详情信息
     */
    EmpRewardPunishVO save(EmpRewardPunishAddDTO empRewardPunishAddDTO, TokenUser tokenUser);

    /**
     * 新增员工奖惩记录 保存do全部数据 仅用于更换公司使用
     *
     * @param empRewardPunishDO 员工奖惩记录
     * @return 员工奖惩记录详情信息
     */
    Integer onlySave(EmpRewardPunishDO empRewardPunishDO);

    /**
     * 修改员工奖惩记录
     *
     * @param empRewardPunishUpdateDTO 修改员工奖惩记录DTO
     * @param tokenUser                当前用户
     * @return 更新数量
     */
    int update(EmpRewardPunishUpdateDTO empRewardPunishUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工奖惩记录，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser          当前用户
     * @param empRewardPunishIds 员工奖惩记录id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empRewardPunishIds);

    /**
     * 根据员工奖惩记录id查找
     *
     * @param empRewardPunishId 员工奖惩记录id
     * @param siteId            所属站点id
     * @return 员工奖惩记录详情信息
     */
    EmpRewardPunishVO selectById(String empRewardPunishId, String siteId);

    /**
     * 查询员工奖惩记录
     *
     * @param empRewardPunishQuery 查询条件
     * @param siteId               所属站点id
     * @return 员工奖惩记录列表信息
     */
    List<EmpRewardPunishListVO> select(EmpRewardPunishQuery empRewardPunishQuery, String siteId);

    /**
     * 查询员工奖惩记录记录数
     *
     * @param empRewardPunishQuery 查询条件
     * @param siteId               所属站点id
     * @return 员工奖惩记录记录数
     */
    int selectCount(EmpRewardPunishQuery empRewardPunishQuery, String siteId);

    /**
     * 分页查询员工奖惩记录
     *
     * @param empRewardPunishQuery 查询条件
     * @param siteId               所属站点id
     * @return 员工奖惩记录列表信息
     */
    Page<EmpRewardPunishListVO> selectPage(EmpRewardPunishQuery empRewardPunishQuery, String siteId);


    /**
     * 根据员工奖惩记录id查找
     *
     * @param empRewardPunishId 员工奖惩记录id
     * @param siteId            所属站点id
     * @return 员工奖惩记录
     */
    EmpRewardPunishDO selectDOById(String empRewardPunishId, String siteId);

    /**
     * 查询员工奖惩记录
     *
     * @param empRewardPunishQuery 查询条件
     * @param siteId               所属站点id
     * @return 员工奖惩记录列表
     */
    List<EmpRewardPunishDO> selectDO(EmpRewardPunishQuery empRewardPunishQuery, String siteId);

    /**
     * 查找某员工的所有奖惩记录
     *
     * @param empId  员工id
     * @param siteId 站点
     * @return 员工的所有奖惩记录
     */
    List<EmpRewardPunishDO> listByEmpId(String empId, String siteId);

    /**
     * 根据公司id删除有奖惩记录
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     */
    void deleteByCompanyId(@NotNull String companyId, TokenUser tokenUser);

    /**
     * 员工奖惩记录
     *
     * @param empRewardPunishList 员工证书
     * @param companyId           公司id
     * @param empId               人员id
     * @param tokenUser           当前用户
     */
    void publishEmpRewardPunishList(List<EmpRewardPunishDTO> empRewardPunishList, String companyId, String empId, TokenUser tokenUser);

}


